#ifndef DBC_H
#define DBC_H

#include <QString>
#include <QList>

typedef quint32 DBcValueTable_t;
typedef quint32 DBcEnvironmentVariable_t;
typedef quint32 DBcSignalTypes_t;
typedef quint32 DBcSignalGroupes_t;



/***********************************************************************************
 * 报文定义
 **********************************************************************************/
typedef enum
{
    normalSignal = 0,  // 普通信号
    muxSignal    = 1,  // 复用信号
    muxSwicth    = 2   // 复用信号的复用开关
}MUxType_t;   // 信号复用属性的定义

typedef enum
{
    bigEndian   = 0,  // 大端字节序 motorola
    littleEndia = 1   // 小端字节序 intel
}BYteOrder_t;  // 信号字节序

typedef enum
{
    unsignedType = 0, // 无符号类型
    signedType   = 1  // 有符号类型
}VAlueType_t;  // 信号数据类型

typedef struct
{
    quint32 id;          // 报文id
    quint32 dlc;         // dlc
    QString name;        // 报文名
    QString transmitter; // 报文发送节点
}DBcMsgHeader_t;  // 报文头信息
/******************
 * 报充数据类型定义
 ****************/
typedef  enum
{
    signedOrUnsigned = 0,
    IeeeFloat        = 1,
    IeeeDouble       = 2
}ExVauleType_t;  // 补充数据类型

typedef struct
{
    quint32       msgId;
    QString       signalName;
    ExVauleType_t ExType;
}SIgnalExValueType_t;  // 信号补充数据类型

typedef struct
{
    quint32       startBit;       // 起始位
    quint32       bitSize;        // 位长度
    BYteOrder_t   byteOrder;      // 字节序
    VAlueType_t   valueType;      // 值类型  unsigned or signed
    ExVauleType_t exVauleType;    // 扩展数据类型
    MUxType_t     mux;            // 复用类型，普通信号，复用信号，或是复用switch
    quint32       muxSwitchValue; // 如果是复用信号，复用switch的值是几时，对应的是该信号
    double        factor;         // physical_value = raw_value * factor + offset
    double        offset;         // raw_value = (physical_value – offset) / factor
    double        min;            // 最大值
    double        max;            // 最小值
    QString       name;           // 信号名
    QString       unit;           // 物理值的单位
    QStringList   receiver;       // 接收该信号的节点（们）
}DBcSignal_t;  // 报文里的信号信息

typedef QList<DBcSignal_t>  DBcSigList_t;  // 信号链表

typedef struct
{
    DBcMsgHeader_t header;    // 报文头
    DBcSigList_t   sigList;   // 信号表
}DBcMessage_t;  // 报文




/***********************************************************************************
 * 注释的类型定义
 **********************************************************************************/
typedef enum
{
   OB_NoObject               = 0, // 无对象      的自定义属性
   OB_BU_NetWorkNode         = 1, // 节点对象    的自定义属性
   OB_BO_Message             = 2, // 消息对象    的自定义属性
   OB_SG_Signal              = 3, // 信号对象    的自定义属性
   OB_EV_EnvironmentVariable = 4  // 环境变量对象的自定义属性
}DBcObjectType_t;   // 对象类型

typedef struct
{
    QString com;     // 注释内容
}DBcComNoObj_t;  // 无指定对象的注释

typedef struct
{
    QString nodeName; // 节点名
    QString com;      // 注释内容
}DBcComNode_t;  // 节点对象的注释

typedef struct
{
    quint32  msgId;    // 报文ID
    QString com;      // 注释内容
}DBcComMsg_t;  // 报文对象的注释

typedef struct
{
    quint32  msgId;    // 报文ID
    QString sigName;  // 信号名
    QString com;      // 注释内容
}DBcComSig_t;  // 信号对象的注释

typedef struct
{
    QString evName;   // 环境变量名
    QString com;      // 注释内容
}DBcComEV_t;  // 环境变量对象的注释


/***********************************************************************************
 * 用户自定义属性定义
 **********************************************************************************/
typedef enum
{
    AttType_INT    = 0,  // 自定义属性为INT型,其内容为2个 signed int 数
    AttType_HEX    = 1,  // 自定义属性为HEX型,其内容为2个十六进制形式的 signed int数
    AttType_FLOAT  = 2,  // 自定义属性为FLOAT型,其内容为2个double数
    AttType_STRING = 3,  // 自定义属性为STRING型，其后不跟内容
    AttType_ENUM   = 4   // 自定义属性为ENUM型，其后内容为多个字符串
}DBcUserDefAttType_t; // 自定义属性数据类型

typedef struct
{
    DBcObjectType_t      objType;   // 对象类型
    QString              attName;   // 属性名
    DBcUserDefAttType_t  attType;   // 属性数据类型
    qint64               value1;    // INT类型属性的值内容 数值1
    qint64               value2;    // INT类型属性的值内容 数值2
}DBcUserDefAttInt_t;   // INT 类型的自定义属性

typedef struct
{
    DBcObjectType_t      objType;   // 对象类型
    QString              attName;   // 属性名
    DBcUserDefAttType_t  attType;   // 属性数据类型
    qint64               value1;    // HEX类型属性的值内容 数值1
    qint64               value2;    // HEX类型属性的值内容 数值2
}DBcUserDefAttHex_t;   // HEX 类型的自定义属性

typedef struct
{
    DBcObjectType_t      objType;   // 对象类型
    QString              attName;   // 属性名
    DBcUserDefAttType_t  attType;   // 属性数据类型
    double               value1;    // FLOAT类型属性的值内容 数值1
    double               value2;    // FLOAT类型属性的值内容 数值2
}DBcUserDefAttFloat_t;   // FLOAT 类型的自定义属性

typedef struct
{
    DBcObjectType_t      objType;   // 对象类型
    QString              attName;   // 属性名
    DBcUserDefAttType_t  attType;   // 属性数据类型
    QString              str;       // STRING 类型属性的内容
}DBcUserDefAttString_t;   // STRING 类型的自定义属性

typedef struct
{
    DBcObjectType_t      objType;   // 对象类型
    QString              attName;   // 属性名
    DBcUserDefAttType_t  attType;   // 属性数据类型
    QStringList          strList;   // ENUM 类型属性的内容
}DBcUserDefAttEnum_t;   // ENUM 类型的自定义属性
// 用户自定义属性举例
//BA_DEF_ SG_  "GenSigSendType" ENUM  "Cyclic","OnWrite","OnWriteWithRepetition","OnChange","OnChangeWithRepetition","IfActive","IfActiveWithRepetition","NoSigSendType";
//BA_DEF_ SG_  "GenSigStartValue" FLOAT 0 100000000000;
//BA_DEF_ SG_  "GenSigInactiveValue" INT 0 0;
//BA_DEF_ BO_  "GenMsgCycleTime" INT 0 10000;
//BA_DEF_ BO_  "GenMsgSendType" ENUM  "Cyclic","not_used","not_used","not_used","not_used","Cyclic","not_used","IfActive","NoMsgSendType";
//BA_DEF_ BU_  "NmStationAddress" HEX 0 0
//BA_DEF_  "BusType" STRING ;




/***********************************************************************************
 * class
 **********************************************************************************/
class dbcClass
{
private:


public:
    dbcClass();
    void clear();
    QString                    version;               // 版本号
    QStringList                newSymbol;             // 新符号
    QString                    bitTiming;             // This section is obsolete and not used any more. Nevertheless he keyword 'BS_' must appear in the DBC file.
    QStringList                node;                  // 节点
    QList<DBcMessage_t>        msgList;               // 消息（报文）
    QList<SIgnalExValueType_t> exTypeList;            // 信号的扩展数据类型列表

    QList<DBcUserDefAttInt_t>    userAttIntList;      // INT 类型的用户自定义属性
    QList<DBcUserDefAttHex_t>    userAttHexList;      // HEX 类型的用户自定义属性
    QList<DBcUserDefAttFloat_t>  userAttFloatList;    // FLOAT 类型的用户自定义属性
    QList<DBcUserDefAttString_t> userAttStringList;   // STRING 类型的用户自定义属性
    QList<DBcUserDefAttEnum_t>   userAttEnumList;     // ENUM 类型的用户自定义属性

    QList<DBcComNoObj_t> comNoObj; // 无指定对象的注释
    QList<DBcComNode_t>  comNode;  // 节点对象的注释
    QList<DBcComMsg_t>   comMsg;   // 报文对象的注释
    QList<DBcComSig_t>   comSig;   // 信号对象的注释
    QList<DBcComEV_t>    comEv;    // 环境变量对象的注释

    /*以下先不用*/
    DBcValueTable_t          valueTable;            // 值表
    DBcEnvironmentVariable_t environmtVariable;     // 环境变量
    DBcSignalTypes_t         signalType;            // 信号类型    基本已不用
    DBcSignalGroupes_t       signalGroupe;          // 信号组      基本已不用
};

#endif // DBC_H
